package queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/*
     阻塞队列 ： 阻塞队列是JDK1.5之后出现的一种新的集合类，BlockingQueue接口

     明确： 阻塞队列是队列中的一种，阻塞队列是具有阻塞效果的队列

     队列：Queue
        特点： 先进先出：FIFO

     阻塞队列：BlockingQueue
         描述： java.util.concurrent.BlockingQueue接口是线程安全的队列，内部实现原理是数组，是具有阻塞效果的队列
         方法：  add(E e) ： 添加元素，如果队列已满，则添加失败【暴露异常】
                offer(E e) ： 添加元素，如果队列已满，则返回false
                put(E e)： 添加元素，如果队列已满，则阻塞
                take() ： 获取元素，如果队列为空，则获取失败【暴露异常】
                poll() ： 获取元素，如果队列为空，则返回null

        子类：
            ArrayBlockingQueue
            LinkedBlockingQueue
            DelayBlockingQueue
            PriorityBlockingQueue
            SynchronousQueue

 */
public class BlockQueueDemo {
    /*
         ArrayBlockingQueue :
             描述： 阻塞队列，数组实现
             特点：
                 1. 有界的
                 2. 底层是数组
                 3. 不能存null

     */
    public static void main(String[] args) {
        //创建一个阻塞队列
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 10; i++){
                    System.out.println(queue.offer(i));
                }
            }
        },"小同志");
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                while (!queue.isEmpty()){
                    try {
                        Integer take = queue.take();
                        System.out.println("小同志正在消费" + take);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"老同志");
        t2.start();
    }
}
